#include <iostream>
#include <fstream>
#include <algorithm>
#include "predicates.h"

std::ifstream in ("in.txt");
std::ofstream out("out.txt");



double get_range (const point &a, const point &b)
{
	return std::pow(a.x - b.x,2) + std::pow(a.y - b.y,2);
}

bool in_circle(circle c, point p)
{
	if (c.bound.size() == 1)
	{
		return (c.bound[0] == p);
	}
	if (c.bound.size() == 2)
	{
		point zero;
		double r1 = hypot(c.bound[0].x - p.x, c.bound[0].y - p.y);
		double r2 = hypot(c.bound[1].x - p.x, c.bound[1].y - p.y);
		double r3 = hypot(c.bound[0].x - c.bound[1].x, c.bound[0].y - c.bound[1].y);
		return r1 + r3 >= r3;
	}
	if (c.bound.size() == 3)
	{	
		point zero;
		double r1 = get_range(zero, c.bound[0]);
		double r2 = get_range(zero, c.bound[1]);
		double r3 = get_range(zero, c.bound[2]);
		double det_1, det_2, det_3;
		det_1 = calculate_det(c.bound[0], c.bound[1], c.bound[2]);
		det_2 = calculate_det(point(r1, c.bound[0].y), point(r2, c.bound[1].y), point(r3, c.bound[2].y));
		det_3 = calculate_det(point(r1, c.bound[0].x), point(r2, c.bound[1].x), point(r3, c.bound[2].x));
		double tmp1 = c.bound[1].x * c.bound[2].y - c.bound[1].y * c.bound[2].x;
		double sum_1 = tmp1 * r1;
		double tmp2;
		tmp1 = r2 * c.bound[2].y - r3 * c.bound[1].y;
		double sum_2 = tmp1 * c.bound[0].x;
		tmp1 = r2 * c.bound[2].x - r3 * c.bound[1].x;
		double sum_3 = tmp1 * c.bound[0].y;
		double det_4 = sum_1 - sum_2 + sum_3;
		double r = std::pow(hypot(p.x, p.y), 2);
		tmp1 = det_1 * r - det_2 * p.x + det_3 * p.y - det_4;
		double result = tmp1 * det_1;
		return result <= 0;
	}
}

circle min_circle (const std::vector<point> &points, std::vector<point> &border, int len)
{
	if ((len == 0) || (border.size() == 3))
	{
		return circle(border);
	}
	circle c = min_circle (points, border, len - 1);
	if (!in_circle(c, points[len - 1]))
	{
		border.push_back(points[len - 1]);
		c = min_circle (points, border, len - 1);
		border.pop_back();
	};
}

circle min_circle_start(std::vector <point> &points)
{
	std::vector<point> tmp;
	std::random_shuffle(points.begin(), points.end());
	int len = points.size();
	circle c = min_circle(points, tmp, len);
	std::sort(c.bound.begin(),c.bound.end());
	return c;
}

int main()
{
	int n;
	std::vector <point> points;
	in >> n;
	for (int i = 0; i < n; i++)
	{
		double x, y;
		point p;
		in >> p.x >> p.y;
		points.push_back(p);
	}
	circle ans = min_circle_start(points);
	for (int i = 0; i < ans.bound.size(); i++)
	{
		out << ans.bound[i].x << ' ' << ans.bound[i].y;
	}
}